<!DOCTYPE html>
<!-- saved from url=(0077)https://open.sf-express.com/developSupport/976720?activeIndex=641728&authId=1 -->
<html lang="" style=""><body class=""><div data-v-7a63e4b3="" class="v-show-content scroll-style scroll-style-border-radius" style="background-color: rgb(251, 251, 251);"><h6><a id="1__font_colorredJAVAJAVAOAuth2font_0"></a>1. 概述 <strong>（<font color="red">适用开发语言JAVA，非JAVA建议使用OAuth2方式对接</font>）</strong></h6>
<ul>
<li>本文档主要规范顺丰统一接入平台和合作伙伴之间的系统对接过程中，msgDigest字段生成方式说明</li>
<li><a href="https://open.sf-express.com/console/BusinessCenter/AuthenticationTestTools" title="点击进入数字签名鉴权测试工具" target="_blank">点击进入数字签名鉴权测试工具</a></li>
</ul>
<h6><a id="3__5"></a>3. 通讯协议与报文格式</h6>
<ul>
<li>
<p>通讯双方采用http post方法作为通讯协议。请求头必须添加</p>
</li>
<li>
<p>“Content-type”,“application/x-www-form-urlencoded;charset=UTF-8” 字符集编码统一使用UTF-8</p>
</li>
<li>
<p>业务数据报文（即msgData字段）支持json格式的报文数据格式</p>
</li>
<li>
<p>接口提交报文为form表单形式</p>
</li>
</ul>
<h6><a id="3__13"></a>3. 数字签名示例</h6>
<ul>
<li>
<p>1、在请求时用“msgData”字段表示要发送的JSON内容；</p>
</li>
<li>
<p>2、在POST时用“msgDigest”字段进行签名验证。签名使用MD5方式，对msgData的内容进行签名。<br>
msgData（业务报文）+ timestamp+checkWord(客户校验码)，经过URLEncoder.encode((msgData+timeStamp+checkWord),“UTF-8”)后进行MD5，最后在转换为Base64字符串<br><br>
详细解释如下：<br>
假设json内容为： {“language”:“zh-CN”,“orderId”:“QIAO-20200618-004”} ， 时间戳为12312334453453，校验码为fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci<br><br>
那么要签名的内容为{“language”:“zh-CN”,“orderId”:“QIAO-20200618-004”}12312334453453fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci（默认UTF-8编码），经过md5和base64后的内容就为IIKJtuLVzoFTu4kHI8M8vA==<br><br>
最终要发送的数据为 msgData={“language”:“zh-CN”,“orderId”:“QIAO-20200618-004”}&amp; msgDigest = IIKJtuLVzoFTu4kHI8M8vA==</p>
</li>
<li>
<p>3、要求CP收到消息后，一定要验证数据是否完整及正确；</p>
</li>
<li>
<p>4、CP收到消息后，内容不正确？请检查字符集是否为UTF-8；所有的参数都是通过URL编码传送的，符合HTTP协议，注意客户端是否解码正确，有些控件已经自带URL解码功能，请开发人员注意。</p>
</li>
</ul>
<p>以下为MD5签名代码示例：</p>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">//客户校验码    使用顺丰分配的客户校验码</span>
<span class="hljs-type">String</span> <span class="hljs-variable">checkWord</span> <span class="hljs-operator">=</span> <span class="hljs-string">"fjcg5PGKaNpPSHFAZ4QsCOkV71R3zVci"</span>;
	
<span class="hljs-comment">//时间戳 取报文中的timestamp（调用接口时间戳）</span>
<span class="hljs-type">String</span> <span class="hljs-variable">timestamp</span> <span class="hljs-operator">=</span> <span class="hljs-string">"12312334453453"</span>;

<span class="hljs-comment">//业务报文  去报文中的msgData（业务数据报文）</span>
<span class="hljs-type">String</span> <span class="hljs-variable">msgData</span> <span class="hljs-operator">=</span> <span class="hljs-string">"{\"language\":\"zh-CN\",\"orderId\":\"QIAO-20200618-004\"}"</span>;
		
<span class="hljs-comment">//将业务报文+时间戳+校验码组合成需加密的字符串(注意顺序)</span>
<span class="hljs-type">String</span> <span class="hljs-variable">toVerifyText</span> <span class="hljs-operator">=</span> msgData+timestamp+checkWord;
		
<span class="hljs-comment">//因业务报文中可能包含加号、空格等特殊字符，需要urlEnCode处理</span>
toVerifyText = URLEncoder.encode(toVerifyText,<span class="hljs-string">"UTF-8"</span>);	

<span class="hljs-comment">//进行Md5加密		</span>
<span class="hljs-type">MessageDigest</span>  <span class="hljs-variable">md5</span> <span class="hljs-operator">=</span> MessageDigest.getInstance(<span class="hljs-string">"MD5"</span>);
md5.update(toVerifyText.getBytes(<span class="hljs-string">"UTF-8"</span>));
<span class="hljs-type">byte</span>[] md = md5.digest();

<span class="hljs-comment">//通过BASE64生成数字签名</span>
<span class="hljs-type">String</span> <span class="hljs-variable">msgDigest</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">String</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">BASE64Encoder</span>().encode(md));
</code></div></pre>
<h6><a id="4_PostmanMD5_53"></a>4. Postman工具MD5加密请求接口示例</h6>
<p><img src="./976720_files/MD5方式.png" alt=" Postman工具MD5加密方式请求接口示例" title=" Postman工具MD5加密方式请求接口示例"></p>
</div></body></html>